<?php
/**
 * @author shenjun
 * @date 2009-09-04
 * @todo 不改变图片比例对图片进行缩小，并加上水印。
 * @example header("Content-type:jpg");
			$watermarkfile=dirname(__FILE__).'/images/topnav_cart_roll.gif';
			$file=dirname(__FILE__).'/file/upload/200906261614062.jpg';
			$image=new images($file);
			$image->set_attribute('width',500);
			$image->set_attribute('need_watermark',true);
			$image->set_attribute('watermarkpic',$watermarkfile);
			$image->set_attribute('watermarkwordcolor',array(110,240,230));
			$image->set_attribute('watermarkpicgray',80);
			$image->set_attribute('watermarkword','test add watermark!');
			echo $image->output();
 * @version 0.8
 * 初次写，中间有很多算法还不够优化。呵呵。有空再改改吧。
 */
class images{
    private $file_path;
    private $width=0;
    private $height=0;
    //定义输出的文件的文件类型
    private $out_type='jpg';
    // 文件类型定义,并指出了输出图片的函数
    private $image_type=array(
        "jpg"  => "imagejpeg",
        "gif"  => "imagegif",
        "png"  => "imagepng",
        "wbmp" => "image2wbmp",
        "jpeg" => "imagejpeg"
    );
    //根据不同的文件类型定义取文件的函数
    private $image_comm=array(
    	'image/png'=>'imagecreatefrompng',
    	'image/gif'=>'imagecreatefromgif',
    	'image/jpeg'=>'imagecreatefromjpeg'
    );
    //当前文件的文件类型
    private $source_type='image/jpeg';
    //是否需要生成水印
    private $need_watermark=false;
    //生成水印的一些参数
    private $watermark=array(
    	'pic'=>'',
    	'word'=>''
    );
    //生成文件水印字体的颜色，可以通过改变这三个值来实现不同的颜色
    private $watermark_word_color=array(
    	0=>255,
    	1=>255,
    	2=>255
    );
    //生成图片水印的图片透明度
    private $watermark_pic_gray=20;
    function __construct($file=null){
    	#为了防止内存溢出。。。。。。
    	ini_set('memory_limit','-1');
        $this->set_file($file);
    }
    /**
     * @author shenjun
     * @date 2009-09-02 
     * @param $file 所指向的文件路径
     * @return 如果指向文件被正确设置，将不返回值，如果设置不成功，将返回假
     */
    function set_file($file){
        if(empty($file)){
            //如果传过来的文件为空
            return false;
        }elseif (!file_exists($file)){
            //如果找不到所指向的文件
            return false;
        }
        $this->file_path=$file;
    }
    /**
     * @author shenjun
     * @todo 取得文件的相关信息 
     * @return unknown_type
     */
    private function file_size($file){
        if(empty($file)){
            return false;
        }
        $size=getimagesize($file);
        $return=array(
            'width'=>$size[0],
            'height'=>$size[1],
            'type'=>$size['mime']
        );
        return $return;
    }
    /**
     * @author shenjun
     * @todo 重新生成文件，类的主函数
     * @date 2009-09-02
     * @return 返回的图片的文件内容
     */
    private function resize_image(){
        $size=$this->return_size();
        $image_file=$this->image_comm[$this->source_type]($this->file_path);
        $im=imagecreatetruecolor($size['width'],$size['height']);
        imagecopyresampled($im,$image_file,0,0,0,0,$size['width'],$size['height'],imagesx($image_file),imagesy($image_file));
        if ($this->need_watermark===true) {
        	//如果需要添加水印
        	$im=$this->add_watermark($im,$size);
        }
        ob_start();
        $this->image_type[$this->out_type]($im,$image);
        ImageDestroy($im);
        $image=ob_get_contents();
        ob_end_clean();
        return $image;
    }
    /**
     * @author shenjun
     * @date 2009-09-04
     * @todo 添加水印
     * 		暂时只不支持定位，图片默认右下角，文件默认左上角
     * @param unknown_type $im 需要加水印的图片
     * @param unknown_type $size 需要加水印的图片的一些属性
     * @return unknown 返回的是加完水印以后的图片
     */
    private function add_watermark($im,$size){
    	if (!empty($this->watermark['pic']) && $this->check_image($this->watermark['pic'])) {
    		//如果水印文件的存在而且合法
    		$source_size=$this->file_size($this->watermark['pic']);
    		$source_image=$this->image_comm[$source_size['type']]($this->watermark['pic']);
    		//计算水印的位置，暂时只支持放在右下角
    		$x=$size['width']-$source_size['width'];
    		$y=$size['height']-$source_size['height'];
    		imagecopymergegray($im,$source_image,$x,$y,0,0,$source_size['width'],$source_size['height'],$this->watermark_pic_gray);
    	}
    	if (!empty($this->watermark['word'])){
    		$color=imagecolorallocate($im,$this->watermark_word_color[0],$this->watermark_word_color[1],$this->watermark_word_color[2]);
    		//计算水印的位置，暂时只支持放在左上角
    		imagestring($im,5,0,0,$this->watermark['word'],$color);
    	}
    	return $im;
    }
    /**
     * @author shenjun
     * @todo 取的生成文件后的文件大小
     * @date 2009-09-02
     * @return 返回的是文件的尺寸
     */
    private function return_size(){
        $file_size=$this->file_size($this->file_path);
        $this->source_type=$file_size['type'];
        $return=array(
        	'height'=>$file_size['height'],
        	'width'=>$file_size['width']
        );
        if($this->height ==0 && $this->width==0){
            #如果没有设置任何的大小，则返回初始大小
            return $return;
        }elseif($this->height>=$return['height'] || $this->width>=$return['width']){
            #如果长或者宽有一个设置成大于或者等于原尺寸，为使原图不变形，则保持原大小不变
            return $return;
        }else{
            $balance=round($return['height']/$return['width'],2);        //取图片的长宽比
            if($this->height ==0){
                $return['width']=$this->width;
                $return['height']=round($this->width*$balance,2);
            }elseif($this->width ==0){
                $return['height']=$this->height;
                $return['width']=round($this->height*$balance,2);
            }
            return $return;
        }
    }
    /**
     * @author shenjun
     * @date 2009-09-03
     * @todo 检查选择的图片是否合要求
     * @param unknown_type $file 需要检查的文件
     * @return unknown 如果合要求返回真，不合要求返回是假
     */
    private function check_image($file){
    	$file_type=$this->file_size($file);
    	switch ($file_type['type']){
    		case 'image/jpg':
    			return true;
    			break;
    		case 'image/gif':
    			return true;
    			break;	
    		case 'image/png':
    			return true;
    			break;
    		case 'image/wbmp':
    			return true;
    			break;
    		case 'image/jpeg':
    			return true;
    			break;	
    		default:
    			return false;
    			break;
    	}
    }
    function get_image(){
        return $this->resize_image();
    }
    /**
     * @author shenjun
     * @todo 设置文件输出的相关属性，比如宽和高等
     * @param $field	对应的改变属性的字段
     * @param $value 改变字字段的值
     * @return unknown_type 如果操作成功则不返回值，操作失败则返回假
     */
    function set_attribute($field,$value){
        switch ($field){
            case 'width':
                $this->width=$value;
                break;
            case 'height':
                $this->height=$value;
                break;
            case 'out_type':
            	$this->out_type=$value;
            	break;
            case 'need_watermark':
            	$this->need_watermark=$value;
            	break;
            case 'watermarkpic':
            	$this->watermark['pic']=$value;
            	break;
            case 'watermarkword':
            	$this->watermark['word']=$value;
            	break;
            case 'watermarkwordcolor':
            	if (is_array($value)) {
            		$this->watermark_word_color[0]=intval($value[0]);
            		$this->watermark_word_color[1]=intval($value[1]);
            		$this->watermark_word_color[2]=intval($value[2]);
            	}
            	break;
            case 'watermarkpicgray':
            	$this->watermark_pic_gray=$value;
            	break;
            default :
                return false;
        }
    }
    ##返回文件的尺寸
    function get_file_size(){
        return $this->file_size();
    }
    ##对公共的输出接口
    function output(){
        return $this->resize_image();
    }
}
?>